1. callee
callee
,返回正在执行的函数本身的引用,是arguments
的一个属性。只有在函数执行时有效;有一个length
属性,可用于获得形参的个数,来比较是否和实参个数一致,即比较arguments.length == arguments.callee.length
;还可用于递归匿名参数;可以用来消除耦合。
1 | // 不用()()立即执行时,则无效。 |
2. caller
caller
,返回一个对函数的引用,该函数调用了当前的函数。只有在函数执行时有效;如果函数由顶层调用,那么返回null
。
1 | // 不用()()立即执行时,则无效。 |
3. call&apply
每个函数都包含两个非继承的方法,call
和apply
。他们的用途都是在特定的作用域中调用函数,获取了另一个对象的方法,并继承对象的属性,只是接收的参数格式不同。它们的重要作用在于能够扩充函数的作用域,而且对象不需要与函数有任何的耦合。
function.call(obj, arg1, arg2, ...)
function.apply(obj, [param1, param2, ...])
obj
将代替函数中的this
对象call
中第二个参数是一个参数列表apply
中第二个参数是一个数组,用来传参给函数中的arguments
1 | function Box(name, size){ |
使用时,如果希望输出结果的参数位置改变,如为Boxes(size, name, number)
,则使用call
更方便Box.call(this, size, name)
。而需要按照顺序对应的情况下,使用apply
的数组参数arguments
则更方便。
4. 其他一些高级用法
对于apply
和call
,还有一些特别的用法,鉴于它两并无太大区别,这里以apply
为例。个人总结该用法如下,非标准表达:
1 | Fun.apply(Obj, arguments); |
解释为,Obj对象调用Fun内部提供的方法,对arguments参数进行操作,此处,Obj对象可为this,null等。此方法颇适用于需要传入列表而非数组表达的参数时,即param1, parram2, param3, ...
而非[param1, param2, param3, ...]
时。
以下三个示例,分别展示了表达式中Obj,Fun和arguments的含义:
1 | var arr = [1, 5, 3]; |
1 | function Arr(){ |
1 | function Box(name, size){ |